/*
 * @Author: wxinlong 3075748076@qq.com
 * @Date: 2023-06-17 10:26:35
 * @LastEditors: wxinlong 3075748076@qq.com
 * @LastEditTime: 2023-06-17 11:03:51
 * @Description: 登录注册控制器
 * Copyright (c) 2023 by wxinlong 3075748076@qq.com, All Rights Reserved.
 */
const User = require('../models/User')
const bcrypt = require('bcrypt')
var jwt = require('jsonwebtoken')

// 注册
async function register(req, res) {
  const { username, password, nickname } = req.body

  try {
    // 检查用户名是否已存在
    const existingUser = await User.findOne({ where: { username } })
    if (existingUser) {
      return res.status(400).json({ msg: '用户名已存在！' })
    }

    // 对密码进行加密处理
    const hashedPassword = await bcrypt.hash(password, 10)

    // 创建新用户
    await User.create({ username, password: hashedPassword, nickname })

    res.status(201).json({ msg: '用户注册成功！' })
  } catch (error) {
    res.status(500).json({ msg: '注册用户失败！' })
    console.log(error)
  }
}

// 登录
async function login(req, res) {
  const { username, password } = req.body

  try {
    // 检查用户名是否存在
    const user = await User.findOne({ where: { username } })
    if (!user) {
      return res.status(401).json({ msg: '无效的用户名或密码！' })
    }

    // 检查密码是否匹配
    const isPasswordMatch = await bcrypt.compare(password, user.password)
    if (!isPasswordMatch) {
      return res.status(401).json({ msg: '无效的用户名或密码！' })
    }

    // 更新用户的最后在线时间
    user.lastOnlineTime = new Date()
    await user.save()

    // 创建 token 访问令牌
    const token = jwt.sign({ userId: user.id }, 'xxx-your-secret-key', {
      expiresIn: '24h'
    })

    // 返回包含令牌、账号名和用户名的响应
    res.json({ token, account: user.username, nickname: user.nickname, userId: user.id })
  } catch (error) {
    res.status(500).json({ msg: '登录失败！' })
    console.log(error)
  }
}

module.exports = { register, login }
